package com.song.tools.export.core.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.song.tools.export.api.request.ExportTaskSaveRequest;
import com.song.tools.export.api.request.ExportTaskUpdateRequest;
import com.song.tools.export.core.ExportTask;
import com.song.tools.export.core.mapper.ExportTaskMapper;
import com.song.tools.export.core.service.ExportTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 导出任务api服务实现类
 *
 * @author song tools
 * @since 2024-07-05
 */
@Service
@Slf4j
public class ExportTaskServiceImpl extends ServiceImpl<ExportTaskMapper, ExportTask> implements ExportTaskService {
    /**
     * 保存导出任务的方法。
     * <p>
     * 该方法接收一个ExportTaskSaveRequest对象作为参数，该对象包含了需要保存的导出任务的相关信息。
     * 方法将对这些信息进行处理，并将处理结果以Long类型返回，通常这个结果是新创建的导出任务的ID。
     *
     * @param request 包含导出任务保存信息的请求对象。
     * @return 返回处理结果，通常是新创建的导出任务的ID。
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long saveExportTask(ExportTaskSaveRequest request) {
        ExportTask exportTask = transformToEntity(request);
        this.save(exportTask);
        return exportTask.getId();
    }

    /**
     * 更新导出任务的状态或配置。
     * <p>
     * 本函数接收一个导出任务更新请求对象，通过该对象提供的信息来更新相应的导出任务。
     * 主要用于在导出任务进行中或完成后，根据用户需求或系统策略对任务进行状态调整或配置修改。
     *
     * @param request 导出任务更新请求对象，包含需要更新的任务ID及相关更新信息。
     * @return 更新后的导出任务id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long updateExportTask(ExportTaskUpdateRequest request) {
        ExportTask exportTask = transformToEntity(request);
        this.updateById(exportTask);
        return exportTask.getId();
    }


    private ExportTask transformToEntity(ExportTaskSaveRequest request) {
        ExportTask exportTask = new ExportTask();
        exportTask.setBusinessId(request.getBusinessId());
        exportTask.setCustomerId(request.getCustomerId());
        exportTask.setExportCondition(request.getExportCondition());
        exportTask.setFileUrl(request.getFileUrl());
        exportTask.setStatus(request.getStatus().getCode());
        exportTask.setSysCode(request.getSystemCode());
        exportTask.setTitle(request.getTitle());
        exportTask.setType(request.getType());
        exportTask.setUserId(request.getUserId());
        exportTask.setUserName(request.getUserName());
        return exportTask;
    }


    private ExportTask transformToEntity(ExportTaskUpdateRequest request) {
        ExportTask exportTask = new ExportTask();
        exportTask.setId(request.getId());
        if (request.getStatus() != null) {
            exportTask.setStatus(request.getStatus().getCode());
        }
        if (request.getFailReason() != null) {
            exportTask.setFailReason(request.getFailReason());
        }
        if (request.getFileUrl() != null) {
            exportTask.setFileUrl(request.getFileUrl());
        }
        if (request.getCustomerId() != null) {
            exportTask.setCustomerId(request.getCustomerId());
        }
        return exportTask;
    }
}
